#ifndef _COUNTRY_MANANGER_H_
#define _COUNTRY_MANANGER_H_

#include "Common.h"
#include "Resource.h"
#include "ResourceManager.h"
#include "Singleton.h"
#include "String.h"

typedef struct game_official_tag_
{

/* !#AUTO DATABASE TABLE GAME_OFFICIALS ST_DEF */
	
		/* '官职id'*/
		uint32 	official_id;
		/* '官职状态 0 无效状态 1 有效状态'*/
		uint32 	status;
		/* '官职标志 0x1 一般官职 0x02 唯一标志'*/
		uint32 	flag;
		/* '官职要求的繁荣度'*/
		uint32 	palmy;
		/* '官职要求的排名'*/
		uint32 	taxis;
		/* '官职的俸禄 (保留两位小数)'*/
		uint32 	payment;
		/* '官职的名称（utf8）'*/
		String 	name;
		/* '官职的说明'*/
		String 	desc;
		/* '官职附加效果1'*/
		uint32 	effect1;
		/* '官职附加效果2'*/
		uint32 	effect2;
		/* '官职附加效果3'*/
		uint32 	effect3;
/* #END DATABASE */
}GameOfficial;



typedef struct country_relation_tag_
{

/* !#AUTO DATABASE TABLE COUNTRY_RELATION ST_DEF */
	
		/* '国家关系序列号'*/
		uint32 	relation_id;
		/* '源国家序列号'*/
		uint32 	src_country;
		/* '目标国家序列号'*/
		uint32 	dest_country;
		/* '关系状态 0 无效状态 1 有效状态 2 冻结状态 3 数据删除状态'*/
		uint32 	status;
		/* '关系标志 (保留)'*/
		uint32 	flag;
		/* '国家关系 0 无效关系 1 盟友 2 敌对 3 一般'*/
		uint32 	mode;
		/* '关系创建时间'*/
		uint32 	create_time;
		/* '操作关系对象序列号'*/
		uint32 	operator_id;
		/* '操作关系对象类型(td)'*/
		uint32 	operator_type;
		/* '关系说明'*/
		String 	desc;
/* #END DATABASE */
}CountryRelation;


class CountryPtr;

class  CountryManager: public ResourceManager,public Singleton<CountryManager>
{
public:
	typedef std::map<uint32,GameOfficial>	OfficialMaps;

	enum RelationStatus
	{
		RelationStatusNone		= 0,	//无效的国家关系
		RelationStatusNormal		= 1,	//一般状态
		RelationStatusFreeze		= 2,	//冻结状态
		RelationStatusDeleted		= 255	//数据删除
	};

	enum RelationMode
	{
		RelationModeNone		= 0,	//无效的关系
		RelationModeAlly		= 1,	//盟友
		RelationModeAdverse		= 2,	//对敌
		RelationModeNormal		= 3	//一般关系
	};

	enum OfficialStatus
	{
		OfficialStatusNone		= 0,	//官职无效状态
		OfficialStatusNormal		= 1	//官职一般状态
	};

	CountryManager();
	~CountryManager();

	String	getCountryStringName(const uint32 & serial);
	
	ResourcePtr  create(const uint32 & serial,const NameValuePairList* params = 0);
	ResourceCreateOrRetrieveResult  \
		createOrRetrieve(const uint32 & serial,const NameValuePairList* params = 0);
	ResourcePtr  load(const uint32 & serial);
	ResourcePtr     reload(ResourceHandle handle);

	//user manager start
	void	Startup(const uint32 & gid,bool isBattle = true);
	void 	Shutdown(void);


	//根据查询，返回符合条件的记录 offset 为翻页起点 limitcount 为取回角色最大数量 query 为查询条件在 WHERE之后
	bool	getCountriesList(std::list<CountryPtr> * chars,const uint32 & offset,const uint32 & limitcount,const char * query,...);

	//根据查询条件返回一个查询结果数量 query 为在WHERE之后的SQL语句
	uint32	getDBCount(const char * query,...);

	//用于得到一个Mail结构，用于向数据库追加新效果的记录
	Resource * newDumyCountry(void);
	void	freeDumyCountry(Resource * dumy);

	//根据模板向数据库插入新的记录，返回插入的记录
	ResourcePtr	createCountryDatabase(Resource * dumy);
	ResourcePtr	loadCountryDatabase(Resource * dumy);


	ResourcePtr   newDBObject(void);
        ResourcePtr   getDBObjectByHandle(const uint32 & handle);
        bool    getDBObjects(std::list<ResourcePtr> * objs,const uint32 & offset,const uint32 & limitcount,const char * query,...);

	//国家关系和国家关系分组管理函数
	//根据结构添加国家关系信息，返回0表示添加失败，成功返回friend_id 
	uint32  addRelationDB(CountryRelation * rel);
	//根据结构，更新国家关系信息数据库
	bool	updateRelationDB(CountryRelation * rel);
	//根据国家关系ID,数据库删除国家关系
	bool	deleteRelationDB(const uint32 & relation_id);
	//根据国家关系ID，得到国家关系信息
	bool  getRelation(const uint32 & relation_id,CountryRelation * rel);

	//根据查询条件，返回一个查询结果
	bool	getRelationList(std::list<CountryRelation> * relations,const uint32 & offset,const uint32 & limitcount,const char * query,...);
	//更加查询条件 返回国家关系查询数量
	uint32 getRelationDBCount(const char * query,...);


	const bool  & isBattleServer(void)	{	return m_battle_server;	}

	const OfficialMaps & getOfficials(void)	{	return m_officials;	}
protected:
	uint32		m_default_gid;
	String		m_default_group;
	bool		m_battle_server;

	OfficialMaps	m_officials;

	bool	loadOfficials(void);
       /// @copydoc ResourceManager::createImpl
        Resource* createImpl(const String& name, ResourceHandle handle,
            const String& group, bool isManual, ManualResourceLoader* loader,
            const NameValuePairList* createParams);
};



#define   sCountryMgr   CountryManager::getSingleton()



#endif
